Gràfics simples en Python amb PIL

Aquest document explica amb dos exemples les instruccions bàsiques que permeten resoldre els problemes del curs “Graphic Problems” de Jutge.org. Les solucions a aquests problemes s’han de codificar usant el llenguatge de programació Python3 amb la llibreria PIL.

Instal·lació 💻

Per poder seguir aquest tutorial haureu d’instal·lar primer la llibreria gràfica Pillow (una branca de PIL):

pip3 install pillow

Segons el vostre sistema, potser haureu d’utilitzar pip enlloc de pip3.

Primer exemple: Bandera del Japó 🇯🇵

Comencem presentant una solució possible del problema P95451 (Bandera del Japó). Recordem que la sortida ha de ser, amb les mides indicades a l’enunciat, senzillament un cercle de color vermell intens sobre un fons blanc:

Editor

Aquest és el codi:

from PIL import Image, ImageDraw

img = Image.new('RGB', (600, 400), 'White')
dib = ImageDraw.Draw(img)

dib.ellipse([150, 50, 449, 349], 'Crimson')

img.save('output.png')

A continuació expliquem els seus elements:

Com a conclusió, si executeu aquest programa i visualitzeu el fitxer output.png, veureu una magnífica bandera dels pais del sol naixent!

Segon exemple: Un mostruari de figures 🖼️

Aquí considerem el problema P85894 (Problema de mostra). Si l’entrada és

Blue
40

la sortida ha de ser

Editor

Aquesta n’és una solució possible:

from PIL import Image, ImageDraw

def rect(x1, y1, x2, y2, col):
    dib.polygon([(x1, y1), (x2, y1), (x2, y2), (x1, y2)], col)

col = input()
n = int(input())
img = Image.new('RGB', (400, 4*n), 'Beige')
dib = ImageDraw.Draw(img)

rect(0, 3*n, 149, 4*n - 1, col)

dib.ellipse([250, n, 399, 3*n - 1], 'Yellow', 'Red')

dib.polygon([(399, 4*n - 1), (200, 4*n - 1), (399, 3*n)], 'Orange')

for x in range (0, 200):
    for y in range(0, 2*n):
        dib.point((x, y), (0, x, 0))

img.save('output.png')

A continuació comentem les novetats que mostra aquest programa:

Com a comentari final, com que els quatre dibuixos d’aquest problema no se superposen, l’ordre en què es fan és irrellevant. Per exemple, podríem dibuixar primer els punts verds, després l’el·lipse, després el triangle i al final el rectangle, i el resultat seria el mateix.




Lliçons.jutge.org
Salvador Roura
Universitat Politècnica de Catalunya, 2023

Prohibit copiar. Tots els drets reservats.
No copy allowed. All rights reserved.